﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Surface;
using Microsoft.Surface.Presentation;
using Microsoft.Surface.Presentation.Controls;

namespace Blip.UI.Controls
{
    /// <summary>
    /// Kontrolka reprezentująca okno z polem tekstowym.
    /// </summary>
    /// <seealso cref="InputTextEventArgs"/>
    public partial class Input : SurfaceUserControl
    {
        /// <summary>
        /// Zdarzenie generowane po przesłaniu wprowadzonego tekstu.
        /// </summary>
        /// <seealso cref="InputTextEventArgs"/>
        public event EventHandler<InputTextEventArgs> ButtonHit;

        /// <summary>
        /// Zdarzenie wywoływane przy próbie zamknięcia okna.
        /// </summary>
        public event EventHandler Cancel;

        /// <summary>
        /// Konstruktor inicjalizujący pole tekstowe.
        /// </summary>
        public Input()
        {
            InitializeComponent();
            DataContext = this;
            okButton.IsEnabled = false;
        }

        /// <summary>
        /// Tekst zachęty.
        /// </summary>
        public string Prompt { get; set; }

        /// <summary>
        /// Zamraża przyciski i pole tekstowe.
        /// </summary>
        /// <returns>Obiekt, na rzecz którego wywoływana jest metoda</returns>
        public Input Freeze()
        {
            okButton.IsEnabled = false;
            cancelButton.IsEnabled = false;
            inputBox.IsEnabled = false;
            return this;
        }

        private void OnOkButtonClick(object sender, RoutedEventArgs e)
        {
            Freeze();
            if (ButtonHit != null)
                ButtonHit(this, new InputTextEventArgs(inputBox.Text));
        }

        private void OnCancelButtonClick(object sender, RoutedEventArgs e)
        {
            Freeze();
            if (Cancel != null)
                Cancel(this, new EventArgs());
        }

        private void OnTextChange(object sender, TextChangedEventArgs e)
        {
            int length = inputBox.Text.Length;
            if (length > 0)
            {
                if (okButton.IsEnabled == false)
                    okButton.IsEnabled = true;
            }
            else
            {
                okButton.IsEnabled = false;
            }
        }        
    }

    /// <summary>
    /// Argument zdarzenia agregujący wprowadzony tekst.
    /// </summary>
    /// <seealso cref="Input"/>
    public class InputTextEventArgs : EventArgs
    {
        /// <summary>
        /// Konstruktor inicjalizujący obiekt argumentów zdarzenia.
        /// </summary>
        /// <param name="input">Wprowadzony tekst</param>
        public InputTextEventArgs(string input)
        {
            Input = input;
        }

        /// <summary>
        /// Tekst z pola tekstowego.
        /// </summary>
        public string Input { get; private set; }
    }
}
